// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef MEDIA_CAST_SENDER_VIDEO_FRAME_FACTORY_H_
#define MEDIA_CAST_SENDER_VIDEO_FRAME_FACTORY_H_

#include <memory>

#include "base/time/time.h"

namespace gfx {
class Size;
}

namespace media {

class VideoFrame;

namespace cast {

    // Interface for an object capable of vending video frames. There is no
    // requirement for a |VideoFrameFactory| to be concurrent but it must not be
    // pinned to a specific thread. Indeed, |VideoFrameFactory| implementations are
    // created by cast on the main cast thread then used by unknown client threads
    // via the |VideoFrameInput| interface.
    //
    // Clients are responsible for serialzing access to a |VideoFrameFactory|.
    // Generally speaking, it is expected that a client will be using these objects
    // from a rendering thread or callback (which may execute on different threads
    // but never concurrently with itself).
    class VideoFrameFactory {
    public:
        virtual ~VideoFrameFactory() { }

        // Creates a |VideoFrame| suitable for input via |InsertRawVideoFrame|. Frames
        // obtained in this manner may provide benefits such memory reuse and affinity
        // with the encoder. The format is guaranteed to be I420 or NV12.
        //
        // This can transiently return null if the encoder is not yet initialized or
        // is re-initializing. Note however that if an encoder does support optimized
        // frames, its |VideoFrameFactory| must eventually return frames. In practice,
        // this means that |MaybeCreateFrame| must somehow signal the encoder to
        // perform whatever initialization is needed to eventually produce frames.
        virtual scoped_refptr<VideoFrame> MaybeCreateFrame(
            const gfx::Size& frame_size, base::TimeDelta timestamp)
            = 0;
    };

} // namespace cast
} // namespace media

#endif // MEDIA_CAST_SENDER_VIDEO_FRAME_FACTORY_H_
